/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.Date;

import javax.annotation.Resource;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.osiris.persistence.controllers.IncertidumbreInterface;
import org.osiris.persistence.controllers.PrioridadInterface;
import org.osiris.persistence.controllers.RequisitoDeProyectoInterface;
import org.osiris.persistence.controllers.RequisitoInterface;
import org.osiris.persistence.controllers.UsuarioInterface;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;
import org.osiris.persistence.controllers.exceptions.PreexistingEntityException;
import org.osiris.server.utils.AppContext;
import org.springframework.context.ApplicationContext;

/**
 *
 * @author amartinez
 */
@Entity
@Table(name = "Requisitosdeproyecto")
@NamedQueries({@NamedQuery(name = "Requisitosdeproyecto.findAll", query = "SELECT r FROM Requisitosdeproyecto r"), @NamedQuery(name = "Requisitosdeproyecto.findByIdProyecto", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.requisitosdeproyectoPK.idProyecto = :idProyecto"), @NamedQuery(name = "Requisitosdeproyecto.findByIdRequisito", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.requisitosdeproyectoPK.idRequisito = :idRequisito"), @NamedQuery(name = "Requisitosdeproyecto.findByFechaalta", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.fechaalta = :fechaalta"), @NamedQuery(name = "Requisitosdeproyecto.findByFechabaja", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.fechabaja = :fechabaja"), @NamedQuery(name = "Requisitosdeproyecto.findByUsuarioalta", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.requisitosdeproyectoPK.usuarioalta = :usuarioalta"), @NamedQuery(name = "Requisitosdeproyecto.findByAdecuacion", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.adecuacion = :adecuacion"), @NamedQuery(name = "Requisitosdeproyecto.findByEsfuerzoFinal", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.esfuerzoFinal = :esfuerzoFinal"), @NamedQuery(name = "Requisitosdeproyecto.findByEstadoRequistoEnProyecto", query = "SELECT r FROM Requisitosdeproyecto r WHERE r.estadoRequistoEnProyecto = :estadoRequistoEnProyecto")})
public class Requisitosdeproyecto implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected RequisitosdeproyectoPK requisitosdeproyectoPK;
    @Column(name = "Fecha_alta")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaalta;
    @Column(name = "Fecha_baja")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechabaja;
    @Column(name = "Adecuacion")
    private BigInteger adecuacion;
    @Column(name = "EsfuerzoFinal")
    private Double esfuerzoFinal;
    @Basic(optional = false)
    @Column(name = "estadoRequistoEnProyecto")
    private String estadoRequistoEnProyecto;
    @JoinColumn(name = "idProyecto", referencedColumnName = "idProyecto", insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Proyecto proyecto;
    @JoinColumn(name = "idRequisito", referencedColumnName = "idRequisito", insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Requisito requisito;
    @JoinColumn(name = "idPrioridadRequisito", referencedColumnName = "idPrioridadRequisito")
    @ManyToOne(fetch = FetchType.LAZY)
    private Prioridadrequisito idPrioridadRequisito;
    @JoinColumn(name = "idIncertidumbre", referencedColumnName = "idIncertidumbre")
    @ManyToOne(fetch = FetchType.LAZY)
    private Incertidumbre idIncertidumbre;
    @JoinColumn(name = "Usuario_alta", referencedColumnName = "idUsuario", insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Usuario usuario;
    @Transient
    @Resource
	private IncertidumbreInterface incertidumbreDAO;
    @Transient
    @Resource
	private RequisitoInterface requisitoDAO;
    @Transient
    Logger logger=Logger.getLogger(this.getClass());
    @Transient
    @Resource
	private RequisitoDeProyectoInterface reqDeProDAO;
    @Transient
    @Resource
    private UsuarioInterface usuarioDAO;
    
    @Transient
	private ApplicationContext ctx = AppContext.getApplicationContext();

    @Transient
    private static final String estado_0="Elicitado";
    @Transient
    private static final String estado_1="Aceptado";
    @Transient
    private static final String estado_2="Rechazado";
	
    @Transient
	@Resource
	private PrioridadInterface prioridadDAO;
    public Requisitosdeproyecto() {
    	
		super();
    }
    public Requisitosdeproyecto(long idProyecto, long idRequisito, long usuarioalta) {
        this.requisitosdeproyectoPK = new RequisitosdeproyectoPK(idProyecto, idRequisito, usuarioalta);
    }
    
    public Requisitosdeproyecto(RequisitosdeproyectoPK requisitosdeproyectoPK) {
        this.requisitosdeproyectoPK = requisitosdeproyectoPK;
    }

    public Requisitosdeproyecto(RequisitosdeproyectoPK requisitosdeproyectoPK, String estadoRequistoEnProyecto) {
        this.requisitosdeproyectoPK = requisitosdeproyectoPK;
        this.estadoRequistoEnProyecto = estadoRequistoEnProyecto;
    }

    

    public void eliminar() {
		try {
			this.reqDeProDAO.destroy(this.getRequisitosdeproyectoPK());
		} catch (NonexistentEntityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

        
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Requisitosdeproyecto)) {
            return false;
        }
        Requisitosdeproyecto other = (Requisitosdeproyecto) object;
        if ((this.requisitosdeproyectoPK == null && other.requisitosdeproyectoPK != null) || (this.requisitosdeproyectoPK != null && !this.requisitosdeproyectoPK.equals(other.requisitosdeproyectoPK))) {
            return false;
        }
        return true;
    }
	public BigInteger getAdecuacion() {
        return adecuacion;
    }

    public Double getEsfuerzoFinal() {
        return esfuerzoFinal;
    }

    public String getEstadoRequistoEnProyecto() {
        return estadoRequistoEnProyecto;
    }

    public Date getFechaalta() {
        return fechaalta;
    }

    public Date getFechabaja() {
        return fechabaja;
    }

    public Incertidumbre getIdIncertidumbre() {
        return idIncertidumbre;
    }

    public Prioridadrequisito getIdPrioridadRequisito() {
        return idPrioridadRequisito;
    }

    public Proyecto getProyecto() {
        return proyecto;
    }

    public Requisito getRequisito() {
        return requisito;
    }

    public RequisitosdeproyectoPK getRequisitosdeproyectoPK() {
        return requisitosdeproyectoPK;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void guardar(){
    	iniciar();
    	try {
			reqDeProDAO.create(this);
		} catch (PreexistingEntityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (requisitosdeproyectoPK != null ? requisitosdeproyectoPK.hashCode() : 0);
        return hash;
    }

    public void iniciar(){
    	if(incertidumbreDAO==null){
    		incertidumbreDAO=(IncertidumbreInterface) ctx.getBean("IncertidumbreJpaController");
		}
    	if(prioridadDAO==null){
    		prioridadDAO=(PrioridadInterface) ctx.getBean("PrioridadrequisitoJpaController");
		}
    	if(reqDeProDAO==null){
    		reqDeProDAO=(RequisitoDeProyectoInterface) ctx.getBean("RequisitosdeproyectoJpaController");
		}
    	if(usuarioDAO==null){
    		usuarioDAO=(UsuarioInterface) ctx.getBean("UsuarioJpaController");
		}
    	if(requisitoDAO==null){
    		requisitoDAO=(RequisitoInterface) ctx.getBean("RequisitoJpaController");
		}
    }

    public void setAdecuacion(BigInteger adecuacion) {
        this.adecuacion = adecuacion;
    }

    public void setEsfuerzoFinal(Double esfuerzoFinal) {
        this.esfuerzoFinal = esfuerzoFinal;
    }

    public void setEstadoRequistoEnProyecto(String estadoRequistoEnProyecto) {
        this.estadoRequistoEnProyecto = estadoRequistoEnProyecto;
    }

    public void setFechaalta(Date fechaalta) {
        this.fechaalta = fechaalta;
    }

    public void setFechabaja(Date fechabaja) {
        this.fechabaja = fechabaja;
    }

    public void setIdIncertidumbre(Incertidumbre idIncertidumbre) {
        this.idIncertidumbre = idIncertidumbre;
    }

    public void setIdPrioridadRequisito(Prioridadrequisito idPrioridadRequisito) {
        this.idPrioridadRequisito = idPrioridadRequisito;
    }

    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    public void setRequisito(Requisito requisito) {
        this.requisito = requisito;
    }

    public void setRequisitosdeproyectoPK(RequisitosdeproyectoPK requisitosdeproyectoPK) {
        this.requisitosdeproyectoPK = requisitosdeproyectoPK;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
	@Override
    public String toString() {
        return "org.osiris.persistence.Requisitosdeproyecto[requisitosdeproyectoPK=" + requisitosdeproyectoPK + "]";
    }

}
